home *** CD-ROM | disk | FTP | other *** search
/ Birds of My State or Province 4.5 / eField Guide Viewer.iso / pc / Windows / CR115.cab / promptengine_calendar.js.9A533B9B_3FA1_4FBA_8E12_9905049DFB24 < prev    next >
Encoding:
Text File  |  2007-09-20  |  31.7 KB  |  989 lines

  1. // BEGIN USER-EDITABLE SECTION -----------------------------------------------------
  2.  
  3. // CALENDAR COLORS
  4. topBackground    = "black";         // BG COLOR OF THE TOP FRAME
  5. bottomBackground = "white";         // BG COLOR OF THE BOTTOM FRAME
  6. tableBGColor     = "black";         // BG COLOR OF THE BOTTOM FRAME'S TABLE
  7. cellColor        = "lightgrey";     // TABLE CELL BG COLOR OF THE DATE CELLS IN THE BOTTOM FRAME
  8. headingCellColor = "white";         // TABLE CELL BG COLOR OF THE WEEKDAY ABBREVIATIONS
  9. headingTextColor = "black";         // TEXT COLOR OF THE WEEKDAY ABBREVIATIONS
  10.  
  11. //dateColor        = "blue";          // TEXT COLOR OF THE LISTED DATES (1-28+)
  12. //focusColor       = "#ff0000";       // TEXT COLOR OF THE SELECTED DATE (OR CURRENT DATE)
  13. //hoverColor       = "darkred";       // TEXT COLOR OF A LINK WHEN YOU HOVER OVER IT
  14. //fontStyle        = "12pt arial, helvetica";           // TEXT STYLE FOR DATES
  15. //they are in CSS file
  16. headingFontStyle = "bold 12pt arial, helvetica";      // TEXT STYLE FOR WEEKDAY ABBREVIATIONS
  17.  
  18. // FORMATTING PREFERENCES
  19. bottomBorder  = false;        // TRUE/FALSE (WHETHER TO DISPLAY BOTTOM CALENDAR BORDER)
  20. tableBorder   = 0;            // SIZE OF CALENDAR TABLE BORDER (BOTTOM FRAME) 0=none
  21.  
  22. var DateTimeFormat = true;        //"DateTime" if true, else a "Date"
  23.  
  24. // END USER-EDITABLE SECTION -------------------------------------------------------
  25.  
  26. // DETERMINE BROWSER BRAND
  27. var isNav = false;
  28. var isIE  = false;
  29.  
  30. // ASSUME IT'S EITHER NETSCAPE OR MSIE
  31. if (navigator.appName == "Netscape") {
  32.     isNav = true;
  33. }
  34. else {
  35.     isIE = true;
  36. }
  37.  
  38. // global variable for top frame and bottom frame
  39. var calDocTop;
  40. var calDocBottom;
  41.  
  42. // PRE-BUILD PORTIONS OF THE CALENDAR WHEN THIS JS LIBRARY LOADS INTO THE BROWSER
  43. buildCalParts();
  44.  
  45. // CALENDAR FUNCTIONS BEGIN HERE ---------------------------------------------------
  46.  
  47. // SET THE INITIAL VALUE OF THE GLOBAL DATE FIELD
  48. function setDateField(formName, dateField) {
  49.  
  50.     // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
  51.     thisform = document.forms[formName];
  52.     calDateField = thisform[dateField];
  53.  
  54.     // GET THE VALUE OF THE INCOMING FIELD
  55.     inDate = thisform[dateField].value;
  56.  
  57.     // SET calDate TO THE DATE IN THE INCOMING FIELD OR DEFAULT TO TODAY'S DATE
  58.     setInitialDate();
  59.  
  60.     // THE CALENDAR FRAMESET DOCUMENTS ARE CREATED BY JAVASCRIPT FUNCTIONS
  61.     calDocTop    = buildTopCalFrame();
  62.     calDocBottom = buildBottomCalFrame();
  63. }
  64.  
  65.  
  66. // SET THE INITIAL CALENDAR DATE TO TODAY OR TO THE EXISTING VALUE IN dateField
  67. function setInitialDate() {
  68.  
  69.     calDate = ParseDate(inDate, DateTimeFormat);
  70.     
  71.     // IF THE INCOMING DATE IS INVALID, USE THE CURRENT DATE
  72.     if (isNaN(calDate)) {
  73.  
  74.         // ADD CUSTOM DATE PARSING HERE
  75.         // IF IT FAILS, SIMPLY CREATE A NEW DATE OBJECT WHICH DEFAULTS TO THE CURRENT DATE
  76.         calDate = new Date();
  77.     }
  78.  
  79.     // KEEP TRACK OF THE CURRENT DAY VALUE
  80.     calDay  = calDate.getDate();
  81.  
  82.     // SET DAY VALUE TO 1... TO AVOID JAVASCRIPT DATE CALCULATION ANOMALIES
  83.     // (IF THE MONTH CHANGES TO FEB AND THE DAY IS 30, THE MONTH WOULD CHANGE TO MARCH
  84.     //  AND THE DAY WOULD CHANGE TO 2.  SETTING THE DAY TO 1 WILL PREVENT THAT)
  85.     calDate.setDate(1);
  86. }
  87.  
  88. // CREATE THE TOP CALENDAR FRAME
  89. function buildTopCalFrame() {
  90.  
  91.     // CREATE THE TOP FRAME OF THE CALENDAR
  92.     var calDoc =
  93.         "<div style=\"background:" + topBackground + "\" >" +
  94.         "<div id='IDcalControl'>" +
  95.         "<CENTER>" +
  96.         "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=0 WIDTH=100%>" +
  97.         "<TR><TD COLSPAN=7>" +
  98.         "<CENTER>" +
  99.         getMonthSelect() +
  100.         "<INPUT id='INtopYear' VALUE='" + calDate.getFullYear() + "'TYPE=TEXT SIZE=4 MAXLENGTH=4 onChange='setYear()' onfocus='INopenDocumentKey()' onblur='INopenDocumentKey()' onkeyup='INopenDocumentKey()' onKeyDown='if (window.event != null && window.event.keyCode == 13) setYear()'>" +
  101.         "</CENTER>" +
  102.         "</TD>" +
  103.         "</TR>" +
  104.         "<TR>" +
  105.         "<TD COLSPAN=7>" +
  106.         "<CENTER>" +
  107.         "<INPUT " +
  108.         "TYPE=BUTTON id='INtopPreviousYear' VALUE='<<'    onClick='setPreviousYear()'><INPUT " +
  109.         "TYPE=BUTTON id='INtopPreviousMonth' VALUE=' < '   onClick='setPreviousMonth()'><INPUT " +
  110.         "TYPE=BUTTON id='INtopToday' VALUE='" + L_Today + "' onClick='setToday()'><INPUT " +
  111.         "TYPE=BUTTON id='INtopNextMonth' VALUE=' > '   onClick='setNextMonth()'><INPUT " +
  112.         "TYPE=BUTTON id='INtopNextYear' VALUE='>>'    onClick='setNextYear()'>" +
  113.         "</CENTER>" +
  114.         "</TD>" +
  115.         "</TR>" +
  116.         "</TABLE>" +
  117.         "</CENTER>" +
  118.         "</div>" +
  119.         "</div>";
  120.  
  121.     return calDoc;
  122. }
  123.  
  124. // CREATE THE BOTTOM CALENDAR FRAME
  125. // (THE MONTHLY CALENDAR)
  126. function buildBottomCalFrame() {
  127.     // START CALENDAR DOCUMENT
  128.     var calDoc = calendarBegin;
  129.  
  130.     // GET MONTH, AND YEAR FROM GLOBAL CALENDAR DATE
  131.     month   = calDate.getMonth();
  132.     year    = calDate.getFullYear();
  133.  
  134.  
  135.     // GET GLOBALLY-TRACKED DAY VALUE (PREVENTS JAVASCRIPT DATE ANOMALIES)
  136.     day     = calDay;
  137.  
  138.     var i   = 0;
  139.  
  140.     // DETERMINE THE NUMBER OF DAYS IN THE CURRENT MONTH
  141.     var days = getDaysInMonth();
  142.  
  143.     // IF GLOBAL DAY VALUE IS > THAN DAYS IN MONTH, HIGHLIGHT LAST DAY IN MONTH
  144.     if (day > days) {
  145.         day = days;
  146.     }
  147.  
  148.     // DETERMINE WHAT DAY OF THE WEEK THE CALENDAR STARTS ON
  149.     var firstOfMonth = new Date (year, month, 1);
  150.  
  151.     // GET THE DAY OF THE WEEK THE FIRST DAY OF THE MONTH FALLS ON
  152.     var startingPos  = firstOfMonth.getDay();
  153.     days += startingPos;
  154.  
  155.     // KEEP TRACK OF THE COLUMNS, START A NEW ROW AFTER EVERY 7 COLUMNS
  156.     var columnCount = 0;
  157.  
  158.     // MAKE BEGINNING NON-DATE CELLS BLANK
  159.     for (i = 0; i < startingPos; i++) {
  160.  
  161.         calDoc += blankCell;
  162.     columnCount++;
  163.     }
  164.  
  165.     // SET VALUES FOR DAYS OF THE MONTH
  166.     var currentDay = 0;
  167.     var dayType    = "weekday";
  168.  
  169.     // DATE CELLS CONTAIN A NUMBER
  170.     for (i = startingPos; i < days; i++) {
  171.  
  172.     var paddingChar = " ";
  173.  
  174.         // ADJUST SPACING SO THAT ALL LINKS HAVE RELATIVELY EQUAL WIDTHS
  175.         if (i-startingPos+1 < 10) {
  176.             padding = "  ";
  177.         }
  178.         else {
  179.             padding = " ";
  180.         }
  181.  
  182.         // GET THE DAY CURRENTLY BEING WRITTEN
  183.         currentDay = i-startingPos+1;
  184.  
  185.         // SET THE TYPE OF DAY, THE focusDay GENERALLY APPEARS AS A DIFFERENT COLOR
  186.         if (currentDay == day) {
  187.             dayType = "focusDay";
  188.         }
  189.         else {
  190.             dayType = "weekDay";
  191.         }
  192.  
  193.         // ADD THE DAY TO THE CALENDAR STRING
  194.         calDoc += "<TD align=center style=\"background:" + cellColor + "\" >" +
  195.                   "<a class='" + dayType + "' href='javascript:returnDate(" +
  196.                   currentDay + ")'>" + padding + currentDay + paddingChar + "</a></TD>";
  197.  
  198.         columnCount++;
  199.  
  200.         // START A NEW ROW WHEN NECESSARY
  201.         if (columnCount % 7 == 0) {
  202.             calDoc += "</TR><TR>";
  203.         }
  204.     }
  205.  
  206.     // MAKE REMAINING NON-DATE CELLS BLANK
  207.     for (i=days; i<42; i++)  {
  208.  
  209.         calDoc += blankCell;
  210.     columnCount++;
  211.  
  212.         // START A NEW ROW WHEN NECESSARY
  213.         if (columnCount % 7 == 0) {
  214.             calDoc += "</TR>";
  215.             if (i<41) {
  216.                 calDoc += "<TR>";
  217.             }
  218.         }
  219.     }
  220.  
  221.     // FINISH THE NEW CALENDAR PAGE
  222.     calDoc += calendarEnd;
  223.  
  224.     // RETURN THE COMPLETED CALENDAR PAGE
  225.     return calDoc;
  226. }
  227.  
  228.  
  229. // WRITE THE MONTHLY CALENDAR TO THE BOTTOM CALENDAR FRAME
  230. function writeCalendar() {
  231.     // CREATE THE NEW CALENDAR FOR THE SELECTED MONTH & YEAR
  232.     calDocBottom = buildBottomCalFrame();
  233.     //it support ie5 and FF
  234.     if (document.getElementById) { // ns6 & ie
  235.         document.getElementById("bottomDiv").innerHTML = calDocBottom;
  236.     } 
  237. }
  238.  
  239. // SET THE CALENDAR TO TODAY'S DATE AND DISPLAY THE NEW CALENDAR
  240. function setToday() {
  241.  
  242.     // SET GLOBAL DATE TO TODAY'S DATE
  243.     calDate = new Date();
  244.  
  245.     // SET DAY MONTH AND YEAR TO TODAY'S DATE
  246.     var month = calDate.getMonth();
  247.     var year  = calDate.getFullYear();
  248.  
  249.     // SET MONTH IN DROP-DOWN LIST
  250.     document.getElementById("INtopMonth").selectedIndex = month;
  251.  
  252.     // SET YEAR VALUE
  253.     document.getElementById("INtopYear").value = year;
  254.  
  255.     // SET THE DAY VALUE
  256.     calDay = calDate.getDate();
  257.  
  258.     // DISPLAY THE NEW CALENDAR
  259.     writeCalendar();
  260. }
  261.  
  262.  
  263. // SET THE GLOBAL DATE TO THE NEWLY ENTERED YEAR AND REDRAW THE CALENDAR
  264. function setYear() {
  265.  
  266.     // GET THE NEW YEAR VALUE
  267.     var year  = document.getElementById("INtopYear").value;
  268.  
  269.     // IF IT'S A FOUR-DIGIT YEAR THEN CHANGE THE CALENDAR
  270.     if (isFourDigitYear(year)) {
  271.         calDate.setFullYear(year);
  272.         writeCalendar();
  273.         //document.getElementById("INtopYear").blur(); it is possiable that user press enter many times
  274.     }
  275.     else {
  276.         // HIGHLIGHT THE YEAR IF THE YEAR IS NOT FOUR DIGITS IN LENGTH
  277.         document.getElementById("INtopYear").focus();
  278.         document.getElementById("INtopYear").select();
  279.     }
  280.     document.onkeydown = function(){return false;}//( if calendar year is onKey, the keypress functions should not be used in the document)
  281. }
  282.  
  283.  
  284. // SET THE GLOBAL DATE TO THE SELECTED MONTH AND REDRAW THE CALENDAR
  285. function setCurrentMonth() {
  286.  
  287.     // GET THE NEWLY SELECTED MONTH AND CHANGE THE CALENDAR ACCORDINGLY
  288.     var month = document.getElementById("INtopMonth").selectedIndex;
  289.  
  290.     calDate.setMonth(month);
  291.     writeCalendar();
  292. }
  293.  
  294.  
  295. // SET THE GLOBAL DATE TO THE PREVIOUS YEAR AND REDRAW THE CALENDAR
  296. function setPreviousYear() {
  297.  
  298.     var year  = document.getElementById("INtopYear").value;
  299.  
  300.     if (isFourDigitYear(year) && year > 1000) {
  301.         year--;
  302.         calDate.setFullYear(year);
  303.         document.getElementById("INtopYear").value = year;
  304.         writeCalendar();
  305.     }
  306. }
  307.  
  308.  
  309. // SET THE GLOBAL DATE TO THE PREVIOUS MONTH AND REDRAW THE CALENDAR
  310. function setPreviousMonth() {
  311.  
  312.     var year  = document.getElementById("INtopYear").value;
  313.     if (isFourDigitYear(year)) {
  314.         var month = document.getElementById("INtopMonth").selectedIndex;
  315.  
  316.         // IF MONTH IS JANUARY, SET MONTH TO DECEMBER AND DECREMENT THE YEAR
  317.         if (month == 0) {
  318.             month = 11;
  319.             if (year > 1000) {
  320.                 year--;
  321.                 calDate.setFullYear(year);
  322.                 document.getElementById("INtopYear").value = year;
  323.             }
  324.         }
  325.         else {
  326.             month--;
  327.         }
  328.         calDate.setMonth(month);
  329.         document.getElementById("INtopMonth").selectedIndex = month;
  330.         writeCalendar();
  331.     }
  332. }
  333.  
  334.  
  335. // SET THE GLOBAL DATE TO THE NEXT MONTH AND REDRAW THE CALENDAR
  336. function setNextMonth() {
  337.  
  338.     var year = document.getElementById("INtopYear").value;
  339.  
  340.     if (isFourDigitYear(year)) {
  341.         var month = document.getElementById("INtopMonth").selectedIndex;
  342.  
  343.         // IF MONTH IS DECEMBER, SET MONTH TO JANUARY AND INCREMENT THE YEAR
  344.         if (month == 11) {
  345.             month = 0;
  346.             year++;
  347.             calDate.setFullYear(year);
  348.             document.getElementById("INtopYear").value = year;
  349.         }
  350.         else {
  351.             month++;
  352.         }
  353.         calDate.setMonth(month);
  354.         document.getElementById("INtopMonth").selectedIndex = month;
  355.         writeCalendar();
  356.     }
  357. }
  358.  
  359.  
  360. // SET THE GLOBAL DATE TO THE NEXT YEAR AND REDRAW THE CALENDAR
  361. function setNextYear() {
  362.  
  363.     var year  = document.getElementById("INtopYear").value;
  364.     if (isFourDigitYear(year)) {
  365.         year++;
  366.         calDate.setFullYear(year);
  367.         document.getElementById("INtopYear").value = year;
  368.         writeCalendar();
  369.     }
  370. }
  371.  
  372.  
  373. // GET NUMBER OF DAYS IN MONTH
  374. function getDaysInMonth()  {
  375.  
  376.     var days;
  377.     var month = calDate.getMonth()+1;
  378.     var year  = calDate.getFullYear();
  379.  
  380.     // RETURN 31 DAYS
  381.     if (month==1 || month==3 || month==5 || month==7 || month==8 ||
  382.         month==10 || month==12)  {
  383.         days=31;
  384.     }
  385.     // RETURN 30 DAYS
  386.     else if (month==4 || month==6 || month==9 || month==11) {
  387.         days=30;
  388.     }
  389.     // RETURN 29 DAYS
  390.     else if (month==2)  {
  391.         if (isLeapYear(year)) {
  392.             days=29;
  393.         }
  394.         // RETURN 28 DAYS
  395.         else {
  396.             days=28;
  397.         }
  398.     }
  399.     return (days);
  400. }
  401.  
  402.  
  403. // CHECK TO SEE IF YEAR IS A LEAP YEAR
  404. function isLeapYear (Year) {
  405.  
  406.     if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
  407.         return (true);
  408.     }
  409.     else {
  410.         return (false);
  411.     }
  412. }
  413.  
  414.  
  415. // ENSURE THAT THE YEAR IS FOUR DIGITS IN LENGTH
  416. function isFourDigitYear(year) {
  417.  
  418.     if (year == null || year.match(/^[0-9]{4}$/) == null){
  419.         document.getElementById("INtopYear").value = calDate.getFullYear();
  420.         document.getElementById("INtopYear").select();
  421.         document.getElementById("INtopYear").focus();
  422.     }
  423.     else {
  424.         return true;
  425.     }
  426. }
  427.  
  428.  
  429. // BUILD THE MONTH SELECT LIST
  430. function getMonthSelect() {
  431.  
  432.     monthArray = new Array(L_January, L_February, L_March, L_April, L_May, L_June,
  433.                            L_July, L_August, L_September, L_October, L_November, L_December);
  434.  
  435.  
  436.     // DETERMINE MONTH TO SET AS DEFAULT
  437.     var activeMonth = calDate.getMonth();
  438.  
  439.     // START HTML SELECT LIST ELEMENT
  440.     monthSelect = "<SELECT id='INtopMonth' onChange='setCurrentMonth()'>";
  441.  
  442.     // LOOP THROUGH MONTH ARRAY
  443.     for (i in monthArray) {
  444.  
  445.         // SHOW THE CORRECT MONTH IN THE SELECT LIST
  446.         if (i == activeMonth) {
  447.             monthSelect += "<OPTION SELECTED>" + monthArray[i] + "\n";
  448.         }
  449.         else {
  450.             monthSelect += "<OPTION>" + monthArray[i] + "\n";
  451.         }
  452.     }
  453.     monthSelect += "</SELECT>";
  454.  
  455.     // RETURN A STRING VALUE WHICH CONTAINS A SELECT LIST OF ALL 12 MONTHS
  456.     return monthSelect;
  457. }
  458.  
  459.  
  460. // SET DAYS OF THE WEEK DEPENDING ON LANGUAGE
  461. function createWeekdayList() {
  462.  
  463.  weekdayArray = new Array(L_Su,L_Mo,L_Tu,L_We,L_Th,L_Fr,L_Sa);
  464.  
  465.  
  466.     // START HTML TO HOLD WEEKDAY NAMES IN TABLE FORMAT
  467.     var weekdays = "<TR BGCOLOR='" + headingCellColor + "'>";
  468.  
  469.     // LOOP THROUGH WEEKDAY ARRAY
  470.     for (i in weekdayArray) {
  471.  
  472.         weekdays += "<TD style='text-decoration: none; color:" + headingTextColor + "; font: " + headingFontStyle + "' align=center>" + weekdayArray[i] + "</TD>";
  473.     }
  474.     weekdays += "</TR>";
  475.  
  476.     // RETURN TABLE ROW OF WEEKDAY ABBREVIATIONS TO DISPLAY ABOVE THE CALENDAR
  477.     return weekdays;
  478. }
  479.  
  480.  
  481. // PRE-BUILD PORTIONS OF THE CALENDAR (FOR PERFORMANCE REASONS)
  482. function buildCalParts() {
  483.  
  484.     // GENERATE WEEKDAY HEADERS FOR THE CALENDAR
  485.     weekdays = createWeekdayList();
  486.  
  487.     // BUILD THE BLANK CELL ROWS 
  488.     blankCell = "<TD align=center style=\"vertical-align:middle; background:" + cellColor + "\" >   </TD>";
  489.  
  490.     // BUILD THE TOP PORTION OF THE CALENDAR PAGE USING CSS TO CONTROL SOME DISPLAY ELEMENTS
  491.     calendarBegin = "";
  492.         // STYLESHEET DEFINES APPEARANCE OF CALENDAR
  493. //        "<STYLE type='text/css'>" +
  494. //        "<!--" +
  495. //\        "TD.heading { text-decoration: none; color:" + headingTextColor + "; font: " + headingFontStyle + "; }" +
  496.  
  497. //  This style must in CSS file 
  498. //        "A.focusDay:link { color: " + focusColor + "; text-decoration: none; font: " + fontStyle + "; }" +
  499. //        "A.focusDay:hover { color: " + focusColor + "; text-decoration: none; font: " + fontStyle + "; }" +
  500. //        "A.focusDay:visited { color: " + focusColor + "; text-decoration: none; font: " + fontStyle + "; }" +
  501. //        "A.weekday:link { color: " + dateColor + "; text-decoration: none; font: " + fontStyle + "; }" +
  502. //        "A.weekday:hover { color: " + hoverColor + "; font: " + fontStyle + "; }" +
  503. //        "A.weekday:visited { color: " + dateColor + "; text-decoration: none; font: " + fontStyle + "; }" +
  504. //        "-->" +
  505. //        "</STYLE>" +
  506.     //the A link style must in CSS file.
  507.         "<div style=\"background:" + bottomBackground + "\" onload='javascript:self.focus()'>";
  508.     if (document.getElementById) { // ns6 & ie
  509.         calendarBegin +=
  510.             "<DIV ID='bottomDiv'>";
  511.     }
  512.     calendarBegin +=
  513.         "<CENTER>";
  514.  
  515.         // NAVIGATOR NEEDS A TABLE CONTAINER TO DISPLAY THE TABLE OUTLINES PROPERLY
  516.         if (isNav) {
  517.             calendarBegin +=
  518.                 "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=" + tableBorder + " ALIGN=CENTER BGCOLOR='" + tableBGColor + "'><TR><TD>";
  519.         }
  520.  
  521.         // BUILD WEEKDAY HEADINGS
  522.         calendarBegin +=
  523.             "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=" + tableBorder + " ALIGN=CENTER BGCOLOR='" + tableBGColor + "'>" +
  524.             weekdays +
  525.             "<TR>";
  526.  
  527.  
  528.     // BUILD THE BOTTOM PORTION OF THE CALENDAR PAGE
  529.     calendarEnd = "";
  530.  
  531.         // WHETHER OR NOT TO DISPLAY A THICK LINE BELOW THE CALENDAR
  532.         if (bottomBorder) {
  533.             calendarEnd += "<TR></TR>";
  534.         }
  535.  
  536.         // NAVIGATOR NEEDS A TABLE CONTAINER TO DISPLAY THE BORDERS PROPERLY
  537.         if (isNav) {
  538.             calendarEnd += "</TD></TR></TABLE>";
  539.         }
  540.  
  541.         // END THE TABLE AND HTML DOCUMENT
  542.         calendarEnd +=
  543.             "</TABLE>" +
  544.             "</CENTER>";
  545.         if (document.getElementById) { // ns6 & ie
  546.             calendarEnd +=
  547.             "</DIV>";
  548.         }
  549.         calendarEnd +=
  550.             "</div>";
  551. }
  552.  
  553.  
  554. // REPLACE ALL INSTANCES OF find WITH replace
  555. // inString: the string you want to convert
  556. // find:     the value to search for
  557. // replace:  the value to substitute
  558. //
  559. // usage:    jsReplace(inString, find, replace);
  560. // example:  jsReplace("To be or not to be", "be", "ski");
  561. //           result: "To ski or not to ski"
  562. //
  563. function jsReplace(inString, find, replace) {
  564.  
  565.     var outString = "";
  566.  
  567.     if (!inString) {
  568.         return "";
  569.     }
  570.  
  571.     // REPLACE ALL INSTANCES OF find WITH replace
  572.     if (inString.indexOf(find) != -1) {
  573.         // SEPARATE THE STRING INTO AN ARRAY OF STRINGS USING THE VALUE IN find
  574.         t = inString.split(find);
  575.  
  576.         // JOIN ALL ELEMENTS OF THE ARRAY, SEPARATED BY THE VALUE IN replace
  577.         return (t.join(replace));
  578.     }
  579.     else {
  580.         return inString;
  581.     }
  582. }
  583.  
  584.  
  585. // JAVASCRIPT FUNCTION -- DOES NOTHING (USED FOR THE HREF IN THE CALENDAR CALL)
  586. function doNothing() {
  587. }
  588.  
  589.  
  590. // ENSURE THAT VALUE IS TWO DIGITS IN LENGTH
  591. function makeTwoDigit(inValue) {
  592.  
  593.     var numVal = parseInt(inValue, 10);
  594.  
  595.     // VALUE IS LESS THAN TWO DIGITS IN LENGTH
  596.     if (numVal < 10) {
  597.  
  598.         // ADD A LEADING ZERO TO THE VALUE AND RETURN IT
  599.         return("0" + numVal);
  600.     }
  601.     else {
  602.         return numVal;
  603.     }
  604. }
  605.  
  606.  
  607. // SET FIELD VALUE TO THE DATE SELECTED AND CLOSE THE CALENDAR WINDOW
  608. function returnDate(inDay)
  609. {
  610.     // inDay = THE DAY THE USER CLICKED ON
  611.     calDate.setDate(inDay);
  612.  
  613.     // SET THE DATE RETURNED TO THE USER
  614.     var day           = calDate.getDate();
  615.     var month         = calDate.getMonth()+1;
  616.     var year          = calDate.getFullYear();
  617.  
  618.     var outDate = "";
  619.     
  620.     outDate += year + "-";
  621.     outDate += month + "-";
  622.     outDate += day;
  623.  
  624.     if ( DateTimeFormat == true ) {
  625.         outDate += " ";
  626.         outDate += gHour + ":";  gHour = "00";
  627.         outDate += gMin  + ":";  gMin  = "00";
  628.         outDate += gSec;         gSec  = "00";
  629.     }
  630.  
  631.     // SET THE VALUE OF THE FIELD THAT WAS PASSED TO THE CALENDAR
  632.     if (calDateField != null && !calDateField.disabled) {
  633.         calDateField.value = outDate;
  634.  
  635.         // GIVE FOCUS BACK TO THE DATE FIELD
  636.         calDateField.focus();
  637.     }
  638.  
  639.     // CLOSE THE CALENDAR "WINDOW"
  640.     document.getElementById("INIDcalendarWindow").style.display="none";
  641.  
  642. }
  643.  
  644. var gHour = "00";
  645. var gMin  = "00";
  646. var gSec  = "00";
  647. var regDateTimePrompt  = /^(D|d)(A|a)(T|t)(E|e)(T|t)(I|i)(M|m)(E|e) *\( *\d{4} *, *(0?[1-9]|1[0-2]) *, *((0?[1-9]|[1-2]\d)|3(0|1)) *, *([0-1]?\d|2[0-3]) *, *[0-5]?\d *, *[0-5]?\d *\)$/
  648. var regDateTimePromptHTML  = /^ *\d{4} *- *(0?[1-9]|1[0-2]) *- *((0?[1-9]|[1-2]\d)|3(0|1)) *  *([0-1]?\d|2[0-3]) *: *[0-5]?\d *: *[0-5]?\d *$/
  649. function ParseDateTimePrompt(inDate)
  650. {
  651.     if ( regDateTimePrompt.test ( inDate ) )
  652.     {
  653.         var sDate = inDate.substr ( inDate.indexOf("(")+1 );    //move past "DateTime ("
  654.         sDate = sDate.substr ( 0, sDate.lastIndexOf(")") );     //remove trailing ")"
  655.         var dateArray = sDate.split (',');
  656.         var _date = new Date ( dateArray[0], Number(dateArray[1]) - 1, dateArray[2] );
  657.         gHour = dateArray[3]; gMin = dateArray[4]; gSec = dateArray[5];
  658.         return _date;
  659.     }
  660.     
  661.     if ( regDateTimePromptHTML.test ( inDate ) )
  662.     {
  663.         var pos = inDate.indexOf("-");
  664.         var sYear = inDate.substr(0, pos);
  665.         var sMonth = inDate.substr(pos + 1);
  666.         
  667.         pos = sMonth.indexOf("-");
  668.         var sDay = sMonth.substr(pos + 1);
  669.         sMonth = sMonth.substr(0, pos);
  670.         
  671.         pos = sDay.indexOf(" ");
  672.         var sHour = sDay.substr(pos + 1);
  673.         sDay = sDay.substr(0, pos);
  674.         
  675.         pos = sHour.indexOf(":");
  676.         var sMinute = sHour.substr(pos + 1);
  677.         sHour = sHour.substr(0, pos);
  678.  
  679.         pos = sMinute.indexOf(":");
  680.         var sSecond = sMinute.substr(pos + 1);
  681.         sMinute = sMinute.substr(0, pos);
  682.         
  683.         gHour = sHour; gMin = sMinute; gSec = sSecond;
  684.         return new Date ( sYear, Number(sMonth) - 1, sDay );
  685.     }
  686.     
  687.     return new Date ();
  688. }
  689.  
  690. var regDatePrompt = /^(D|d)(A|a)(T|t)(E|e) *\( *\d{4} *, *(0?[1-9]|1[0-2]) *, *((0?[1-9]|[1-2]\d)|3(0|1)) *\)$/
  691. var regDatePromptHTML  = /^ *\d{4} *- *(0?[1-9]|1[0-2]) *- *((0?[1-9]|[1-2]\d)|3(0|1)) *$/
  692. function ParseDatePrompt(inDate)
  693. {
  694.     if ( regDatePrompt.test ( inDate ) )
  695.     {
  696.         var sDate = inDate.substr ( inDate.indexOf("(")+1 );    //move past "Date ("
  697.         sDate = sDate.substr ( 0, sDate.lastIndexOf(")") );     //remove trailing ")"
  698.         var dateArray = sDate.split (',');
  699.         return new Date ( dateArray[0], Number(dateArray[1]) - 1, dateArray[2] );
  700.     }
  701.     
  702.     if ( regDatePromptHTML.test ( inDate ) )
  703.     {
  704.         var pos = inDate.indexOf("-");
  705.         var sYear = inDate.substr(0, pos);
  706.         var sMonth = inDate.substr(pos + 1);
  707.         
  708.         pos = sMonth.indexOf("-");
  709.         var sDay = sMonth.substr(pos + 1);
  710.         sMonth = sMonth.substr(0, pos);
  711.         
  712.         return new Date ( sYear, Number(sMonth) - 1, sDay );
  713.     }
  714.     
  715.     return new Date();
  716. }
  717.  
  718. function ParseDate(inDate, bDateTimeFormat)
  719. {
  720.     var result;
  721.     
  722.     if (bDateTimeFormat == true) {
  723.         result = ParseDateTimePrompt(inDate);
  724.     } else {
  725.         result = ParseDatePrompt(inDate);
  726.     }
  727.     
  728.     return result;
  729. }
  730. //---------------------------------------------------------------
  731. //for write the calendar in page.
  732. var INwidth = 230;
  733. var INheight = 250;//the size(default value)
  734. var INscreenX =0;
  735. var INscreenY =0;//the positon
  736. function INCreateCalendar(titleImagePath, closeImagePath)
  737. {
  738.     if(document.getElementById("INIDcalendarWindow") == null)
  739.     {
  740.         var inlineCalendarWindow =          
  741.             "<div class=\"INcalendarWindow\" id=\"INIDcalendarWindow\" onmousedown=\"INnoClose()\"> " +
  742.             "<iframe src=\"\" scroll=none frameborder=0 style=\"width:100%;height:100%;position:absolute;z-index:-9999\"></iframe> " + 
  743.             "<div class=\"INcalendarTitle\" onmousedown=\"dragStart(event,'INIDcalendarWindow')\"> " +
  744.             "<table  cellspacing=\"0\" cellpadding=\"1\" border=\"0\" style=\"background:url(\'" + titleImagePath + "button_middle_normal.gif\');\"> " + 
  745.             "<tr> " + 
  746.             "<td class=\"INtitleText\"> Business Objects</td> " + 
  747.             "<td class=\"INclose\" onclick=\"INcloseWin()\"><img alt=\"Close\" src=\"" + closeImagePath + "errormsg.gif\" height=\"12\" width=\"12\"/></td> " + 
  748.             "</tr> " + 
  749.             "</table> " + 
  750.             "</div> " + 
  751.             "<div class=\"INcalendarTop\" id=\"INIDcalendarTop\"> </div> " + 
  752.             "<div class=\"INcalendarBottom\" id=\"INIDcalendarBottom\"> </div> " + 
  753.             "</div>";
  754.         if(document.body.insertAdjacentHTML)
  755.         {
  756.             document.body.insertAdjacentHTML("afterBegin", inlineCalendarWindow);
  757.         }
  758.         else
  759.         {
  760.             var calendarWindow = document.createElement("div"); 
  761.             calendarWindow.innerHTML = inlineCalendarWindow;
  762.             document.body.appendChild(calendarWindow);
  763.         }
  764.     }
  765. }
  766. function INwriteCalendar(event, Iwidth, Iheight,IscreenX,IscreenY)
  767. {
  768.     var eventXForNav;
  769.     var eventYForNav;
  770.     if (isNav)
  771.     {
  772.         eventXForNav = event.clientX;
  773.         eventYForNav = event.clientY;//this is a strange case for Firefox:If you get event.clientX after set innerHTML, event.clientX is changed. So I have to record it at the beginning.
  774.     }
  775.  
  776.  
  777.     INwidth = Iwidth;
  778.     INheight = Iheight;
  779.     INscreenX = IscreenX;
  780.     INscreenY = IscreenY;
  781.     //location and size
  782.     document.getElementById("INIDcalendarWindow").style.left= INscreenX;
  783.     document.getElementById("INIDcalendarWindow").style.top= INscreenY;
  784.     document.getElementById("INIDcalendarWindow").style.width= INwidth;
  785.     document.getElementById("INIDcalendarWindow").style.height= INheight;
  786.     var x,y;
  787.     var windowX, windowY;
  788.     var calendarWidth;
  789.     var calendarHeight;
  790.     if (isIE)
  791.     {
  792.       x = window.event.clientX + document.documentElement.scrollLeft
  793.         + document.body.scrollLeft;
  794.       y = window.event.clientY + document.documentElement.scrollTop
  795.         + document.body.scrollTop;
  796.  
  797.       windowX = document.body.clientWidth + document.documentElement.scrollLeft 
  798.         + document.body.scrollLeft;
  799.       windowY = document.body.clientHeight + document.documentElement.scrollTop
  800.         + document.body.scrollTop;
  801.  
  802.       calendarWidth = 230;
  803.       calendarHeight = 250;
  804.  
  805.     }
  806.     if (isNav)
  807.     {
  808.       x = eventXForNav + window.scrollX;
  809.       y = eventYForNav + window.scrollY;
  810.  
  811.       windowX = window.innerWidth + window.scrollX -15;//for firefox scroll bar
  812.       windowY = window.innerHeight + window.scrollY;//left-right scroll bar usually do not has
  813.  
  814.       calendarWidth = 230 + 8;//for firefox.
  815.       calendarHeight = 250 + 8;
  816.  
  817.     }
  818.     var calendarLeftOffsetFromImage = 15;
  819.     var calendarTopOffsetFromImage = 15;
  820.     //location of the window
  821.     //first, check the right bottom
  822.     if( windowX-x >= calendarWidth && windowY-y >= calendarHeight)//right bottom
  823.     {
  824.         document.getElementById("INIDcalendarWindow").style.left= x;
  825.         document.getElementById("INIDcalendarWindow").style.top= y;
  826.     }
  827.     else if(windowX-x >= calendarWidth && windowY-y < calendarHeight)//right bottom, move up
  828.     {
  829.         document.getElementById("INIDcalendarWindow").style.left= x;
  830.         document.getElementById("INIDcalendarWindow").style.top= windowY - calendarHeight;
  831.     }
  832.     else if(windowX-x < calendarWidth && windowY-y >= calendarHeight)//right bottom, move left
  833.     {
  834.         document.getElementById("INIDcalendarWindow").style.left= windowX - calendarWidth;
  835.         document.getElementById("INIDcalendarWindow").style.top= y;
  836.     }
  837.     //right bottom has no enough space. try to show it left bottom (right, bottom is not enough)
  838.     else if(windowY > calendarHeight && x - calendarLeftOffsetFromImage > calendarWidth)//left bottom(left enough)
  839.     {
  840.         document.getElementById("INIDcalendarWindow").style.left= x - calendarLeftOffsetFromImage - calendarWidth;
  841.         document.getElementById("INIDcalendarWindow").style.top= windowY - calendarHeight;
  842.     }
  843.     //left bottom has no enough space. try to show it top (left, right, bottom is not enough)
  844.     else if(windowX > calendarWidth && y - calendarTopOffsetFromImage >= calendarHeight)//right top
  845.     {
  846.         document.getElementById("INIDcalendarWindow").style.left= windowX - calendarWidth;
  847.         document.getElementById("INIDcalendarWindow").style.top= y - calendarTopOffsetFromImage - calendarHeight;
  848.     }
  849.     else//right bottom has no enough space. show it anyway
  850.     {
  851.         document.getElementById("INIDcalendarWindow").style.left= windowX - calendarWidth;//move left
  852.         document.getElementById("INIDcalendarWindow").style.top= windowY - calendarHeight;//move up.
  853.     }
  854.  
  855.  
  856.     document.getElementById("INIDcalendarTop").innerHTML = calDocTop;
  857.     document.getElementById("INIDcalendarBottom").innerHTML = calDocBottom;
  858.  
  859.  
  860.     document.getElementById("INIDcalendarWindow").style.display="block";
  861. }
  862. function INcloseWin()
  863. {
  864.     document.getElementById("INIDcalendarWindow").style.display="none";
  865. }
  866.  
  867. //--------------------------drag-functions--------------------------------
  868. var dragObject = new Object();
  869. dragObject.zIndex = 0;
  870.  
  871. function dragStart(event, id)
  872. {
  873.   var el;
  874.   var x, y;
  875.  
  876.   if (id)//notice: the id must be set!!
  877.   {
  878.     dragObject.elNode = document.getElementById(id);
  879.   }
  880.   
  881.   if (isIE) {
  882.     x = window.event.clientX + document.documentElement.scrollLeft
  883.       + document.body.scrollLeft;
  884.     y = window.event.clientY + document.documentElement.scrollTop
  885.       + document.body.scrollTop;
  886.   }
  887.   if (isNav) {
  888.     x = event.clientX + window.scrollX;
  889.     y = event.clientY + window.scrollY;
  890.   }
  891.  
  892.   dragObject.cursorStartX = x;
  893.   dragObject.cursorStartY = y;
  894.   dragObject.elStartLeft  = parseInt(dragObject.elNode.style.left, 10);
  895.   dragObject.elStartTop   = parseInt(dragObject.elNode.style.top,  10);
  896.  
  897.   if(isIE)
  898.   {
  899.     if (isNaN(dragObject.elStartLeft)) dragObject.elStartLeft = INscreenX + INwidth/2 + 20;//original position
  900.     if (isNaN(dragObject.elStartTop))  dragObject.elStartTop  = INscreenY - INheight + 20;//+20 make it look better
  901.   }
  902.   else
  903.   {
  904.     if (isNaN(dragObject.elStartLeft)) dragObject.elStartLeft = INscreenX;//original position
  905.     if (isNaN(dragObject.elStartTop))  dragObject.elStartTop  = INscreenY;// make it look better
  906.   }    
  907.  
  908.   dragObject.elNode.style.zIndex = ++dragObject.zIndex;
  909.  
  910.   if (isIE) {
  911.     document.attachEvent("onmousemove", dragBegin);
  912.     document.attachEvent("onmouseup",   dragEnd);
  913.     window.event.cancelBubble = true;
  914.     window.event.returnValue = false;
  915.   }
  916.   if (isNav) {
  917.     document.addEventListener("mousemove", dragBegin,   true);
  918.     document.addEventListener("mouseup",   dragEnd, true);
  919.     event.preventDefault();
  920.   }
  921. }
  922.  
  923. function dragBegin(event)//mouse move
  924. {
  925.   var x, y;
  926.   if (isIE) {
  927.     x = window.event.clientX + document.documentElement.scrollLeft
  928.       + document.body.scrollLeft;
  929.     y = window.event.clientY + document.documentElement.scrollTop
  930.       + document.body.scrollTop;
  931.   }
  932.   if (isNav) {
  933.     x = event.clientX + window.scrollX;
  934.     y = event.clientY + window.scrollY;
  935.   }
  936.  
  937.   dragObject.elNode.style.left = (dragObject.elStartLeft + x - dragObject.cursorStartX) + "px";
  938.   dragObject.elNode.style.top  = (dragObject.elStartTop  + y - dragObject.cursorStartY) + "px";//set the position
  939.  
  940.   if (isIE) {
  941.     window.event.cancelBubble = true;
  942.     window.event.returnValue = false;
  943.   }
  944.   if (isNav)
  945.     event.preventDefault();
  946. }
  947.  
  948. function dragEnd(event)//mouse stop
  949. {
  950.     dragObject.elNode = null;
  951.     if (isIE)
  952.     {
  953.         document.detachEvent("onmousemove", dragBegin);
  954.         document.detachEvent("onmouseup",   dragEnd);
  955.     }
  956.     if (isNav)
  957.     {
  958.         document.removeEventListener("mousemove", dragBegin,   true);
  959.         document.removeEventListener("mouseup",   dragEnd, true);
  960.     }
  961. }
  962. //----------for click close calendar---------------------------------------------------------------
  963. var CloseIt = true;
  964. function clickit()
  965. {
  966.     if(CloseIt)
  967.     {
  968.         if(document.getElementById("INIDcalendarWindow")!= null)//should have the calendar div
  969.         {
  970.             INcloseWin();
  971.         }
  972.     }
  973.     else
  974.     {
  975.         CloseIt = true;
  976.     }
  977. }
  978. function INnoClose()
  979. {
  980.     CloseIt = false;
  981. }
  982. document.onmousedown= clickit;
  983. //---for calendar onKey functions( if calendar year is onKey, the keypress functions should not be used in the document)----
  984. function INopenDocumentKey()
  985. {
  986.     document.onkeydown = function(){return true;}
  987. }
  988. //---------------------------------------------------------------------------------------
  989.